package top.as.sean.common.redis;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁
 *
 * @author ArchieSean
 * @date 2021年9月30日16:27:35
 */

@Component
@Slf4j
@AllArgsConstructor
@ConditionalOnMissingBean(RedisAutoConfiguration.class)
public class LockUtil {

    private static final int TIME_OUT = 60;
    private final RedissonClient redissonClient;


    /**
     * 获取分布式锁对象
     *
     * @param key 加锁关键字
     * @return RLock
     * @date 2021年9月30日16:40:30
     */
    public RLock getLock(String key) {
        return redissonClient.getLock(key);
    }

    /**
     * 获取分布式锁
     *
     * @param lock 参数
     * @return boolean
     * @date 2021年9月30日16:40:30
     */
    public boolean isLocked(RLock lock) {
        try {
            int waitTime = 0;
            return lock.tryLock(waitTime, TIME_OUT, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            log.info("获取分布式锁：{}失败", lock.getName());
            return false;
        }
    }

    /**
     * 释放锁
     *
     * @param lock 参数
     * @date 2021年9月30日16:45:28
     */
    public void unlock(RLock lock) {
        lock.unlock();
    }

    /**
     * 判断是否是当前线程加的锁
     *
     * @param lock 参数
     * @return boolean
     * @date 2021年9月30日16:45:28
     */
    public boolean isLockedByCurrentThead(RLock lock) {
        try {
            return lock.isHeldByCurrentThread();
        } catch (Exception e) {
            log.info("获取分布式锁：{}失败", lock.getName());
            return false;
        }
    }

}
